package cn.wolfcode.crm.service.impl;

import cn.wolfcode.crm.domain.CalendarPlan;
import cn.wolfcode.crm.domain.Employee;
import cn.wolfcode.crm.mapper.CalendarPlanMapper;
import cn.wolfcode.crm.query.QueryObject;
import cn.wolfcode.crm.service.ICalendarPlanService;
import cn.wolfcode.crm.util.PageResult;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.xml.crypto.Data;
import java.awt.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Service
public class CalendarPlanServiceImpl implements ICalendarPlanService {
    @Autowired
    private CalendarPlanMapper calendarPlanMapper;

    @Override
    public void deleteByPrimaryKey(Long id) {
        calendarPlanMapper.deleteByPrimaryKey(id);
    }

    /**
     * 思路:
     * 1.基本的添加功能,获取到当前的用户和时间,分别封装进对象当中去,在调用添加方法.
     * 在添加之前要对一些情况分开来讨论:
     * 1.开始日期要小于结束日期.
     *
     * @param entity
     */
    @Override
    public void insert(CalendarPlan entity) {
        Date startDate = entity.getStartDate();
        Date endDate = entity.getEndDate();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        //将开始日期和开始时间转换成字符串形式
        Date startTime = entity.getStartTime();
        Date endTime = entity.getEndTime();
        //将开始时间和接收时间转换成字符串形式
        String newDate = dateFormat.format(date);
        String startTimeFormat = dateFormat.format(startTime);
        String endTimeFormat = dateFormat.format(endTime);
        try {
            Date startParse = dateFormat.parse(startTimeFormat);
            Date endParse = dateFormat.parse(endTimeFormat);
            Date newDateParse = dateFormat.parse(newDate);
            //开始日期的年月日要等于开始时间的年月日,结束日期和结束时间也是如此
            if (startParse.equals(startDate) && endParse.equals(endDate)) {
                //做添加操作的时候,结束的时间要大于开始的时间,开始的时间和结束的时间均要大于先在的时间
                if (!endDate.after(startDate)) {
                    throw new RuntimeException("结束时间不能小于开始时间~");
                } else if (!endDate.after(newDateParse)) {
                    throw new RuntimeException("开始时间都要比结束时间大,还定个屁的日程记录啊!!!");
                } else if (startDate.before(newDateParse)) {
                    throw new RuntimeException("定制日程的时候,开始时间不能小于当前时间!!");
                } else {
                    //获取到当前用户
                    Employee employee = (Employee) SecurityUtils.getSubject().getPrincipal();
                    //将当前用户还有当前时间赋值给CalendarPlan对象
                    entity.setInputWho(employee);
                    entity.setInputWhen(date);
                    calendarPlanMapper.insert(entity);
                }
            } else {
                throw new RuntimeException("开始时间和开始日期要相同,而且结束日期和结束时间也要相同...");
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

    }

    @Override
    public CalendarPlan selectByPrimaryKey(Long id) {
        return calendarPlanMapper.selectByPrimaryKey(id);
    }

    /**
     * 根据用户的id来查询个人日程安排
     *
     * @return
     */
    @Override
    public List<CalendarPlan> selectAll() {
        Employee inputWho = (Employee) SecurityUtils.getSubject().getPrincipal();
        return calendarPlanMapper.selectAll(inputWho.getId());
    }

    /**
     * 1.可能会这么一种情况,做任务做了花了一半的日程,然后老板说时间增加了,日程可以往后挪,这个时候就可以修改结束时间,但不能小于当前的时间
     * 2.开始日期有两种情况,当开始日期大于当前日期,那么可以随意修改只要不大于结束日期并且不小于当前日期,
     * 3.当开始日期小于当前日期的时候,则不能修改当前日期
     * 4.当前的日期和当前时间的日期要相等才能让它执行
     */
    @Override
    public void updateByPrimaryKey(CalendarPlan entity) {
        Date startDate = entity.getStartDate();
        Date endDate = entity.getEndDate();
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        String startFormat = dateFormat.format(startDate);
        String endFormat = dateFormat.format(endDate);
        Date startTime = entity.getStartTime();
        Date endTime = entity.getEndTime();
        String startTimeFormat = dateFormat.format(startTime);
        String endTimeFormat = dateFormat.format(endTime);
        if (startFormat.equals(startTimeFormat) && endFormat.equals(endTimeFormat)) {
            if (endDate.after(startDate)) {
                //开始日期和结束日期大于当前日期,就让它正常执行修改
                if (endDate.after(date) && startDate.after(date) && startDate.equals(date)) {
                    entity.setInputWhen(date);
                    calendarPlanMapper.updateByPrimaryKey(entity);
                    //开始时间小于当前时间,执行修改的时候就额外写一条sql让它不能修改开始时间
                } else if (endDate.after(date) && date.after(startDate)) {
                    entity.setInputWhen(date);
                    calendarPlanMapper.updateByStartDateAndDate(entity);
                } else if (date.after(endDate)) {
                    throw new RuntimeException("你日程都结束了还改个屁呀~~~");
                }
            } else {
                throw new RuntimeException("开始时间都要比结束时间大,还定个屁的日程记录啊!!!");
            }
        } else {
            throw new RuntimeException("你开始时间和开始日期都不是同一天,怎么能让你制定成功...");
        }
    }

    @Override
    public PageResult query(QueryObject qo) {
        Integer total = calendarPlanMapper.query4Count(qo);
        if (total == 0) {
            return PageResult.PAGERESULT_EMPTY;
        }
        return new PageResult(total, calendarPlanMapper.query4List(qo));
    }
}
